/**
 * 作者：夏冬琦
 * 最后修改时间：2018-12-26
 */




class Server{

	/**
	 * 构造方法
	 * @param {*} serverConfig 
	 * 	参数说明：
	 * 	{
	 * 		ip:'服务器ip地址',
	 * 		port:服务器端口号,
	 * 		app:'服务应用名称'
	 * 	}
	 */
	constructor(serverConfig){

		if(!serverConfig){
			if(window.localStorage){

				let ip = window.localStorage.getItem('server.ip');
				let port = window.localStorage.getItem('server.port');
				let app = window.localStorage.getItem('server.app');
				
				if( !ip || !port || !app ){
					this.serverConfig = undefined;
				}else{
					this.serverConfig={
						ip:ip,
						port:port,
						app:app
					}
					window.localStorage.setItem('server.ip',this.serverConfig.ip);
					window.localStorage.setItem('server.port',this.serverConfig.port);
					window.localStorage.setItem('server.app',this.serverConfig.app);
				}
				
			}else{
				this.serverConfig = undefined;				
			}

		}else{
			
			if( !serverConfig.ip || !serverConfig.port || !serverConfig.app ){
				this.serverConfig = undefined;
			}else{
				this.serverConfig={
					ip:serverConfig.ip,
					port:serverConfig.port,
					app:serverConfig.app
				};
				window.localStorage.setItem('server.ip',this.serverConfig.ip);
				window.localStorage.setItem('server.port',this.serverConfig.port);
				window.localStorage.setItem('server.app',this.serverConfig.app);
			}
			
			
		}

		
		
	}

	/**
	 * 设置服务器参数
	 * @param {} serverConfig 
	 */
	setServerConfig(serverConfig){
		if( !serverConfig.ip || !serverConfig.port || !serverConfig.app ){
			this.serverConfig = undefined;
		}else{
			this.serverConfig={
				ip:serverConfig.ip,
				port:serverConfig.port,
				app:serverConfig.app
			};
			window.localStorage.setItem('server.ip',this.serverConfig.ip);
			window.localStorage.setItem('server.port',this.serverConfig.port);
			window.localStorage.setItem('server.app',this.serverConfig.app);
		}
	}

	/**
	 * 获得基础url
	 */
	baseURL(){
		if(this.serverConfig){
			return `http://${this.serverConfig.ip}:${this.serverConfig.port}/${this.serverConfig.app}/`;
		}
		return '';
		
	}

	/**
	 * 
	 * @param {*} options 
	 *  参数说明：
	 * 	{
	 * 		url:'请求地址，默认""',
	 * 		method:'请求方式，默认POST',
	 * 		data:'请求数据（参数），默认undefined',
	 * 		type:'响应数据类型，默认JSON',
	 * 		contentType:'请求数据类型，默认application/x-www-form-urlencoded',
	 * 		processData:是否将请求数据序列化为请求参数串形式（如"param1=abc&param2=678"） 默认为true,
	 * 		handler:处理响应数据的回调函数 参数为响应数据
	 * 	}
	 */
	ajax(options){	
		
		let url = this.baseURL()+(options.url?options.url:'');
		let method = options.method?options.method:'POST';
		let data = options.data?options.data:undefined;
		let type = options.dataType?options.dataType:'JSON';
		let contentType = options.contentType===false ? false : ( options.contentType?options.contentType:'application/x-www-form-urlencoded');
		let processData = options.processData===false ? false : (options.processData?options.processData:true);
		
		let myhandler = options.handler && typeof(options.handler)==='function' ? options.handler : undefined;
		
		let index = layer.load();//显示加载层
		try{
			console.log({
				url:url,
				data:data,
				method:method,
				dataType:type,
				contentType:contentType,
				processData:processData,
				xhrFields:{withCredentials: true},
				crossDomain: true
			});
			$.ajax({
				url:url,
				data:data,
				method:method,
				dataType:type,
				contentType:contentType,
				processData:processData,
				xhrFields:{withCredentials: true},//启用跨域认证（启用Session追踪）
				crossDomain: true
			}).done((data) => {
				layer.close(index);
				try{
					
					if(myhandler){
						myhandler(data);
					}
					
				}catch(err){
					console.log(err);
					
					/*
					layer.msg("JS代码可能出错了！", {
					  icon: 5
					});
					 */
					
					this.alert({
					  type: 'error',
					  title: 'JS代码可能出错了！'
					});
					
				}
				
			}).fail((xhr) => {
				layer.close(index);
				console.log(xhr);
				
				/*
				layer.msg("服务器端错误："+xhr.status, {
				  icon: 5
				});
				*/
				
				this.alert({
				  type: 'error',
				  title: "服务器错误："+xhr.status
				});
				
				
			});
			
		}catch(err){
			layer.close(index);
			console.log(err);
			
			/*
			layer.msg("JS代码可能出错了！", {
			  icon: 5
			});
			*/
			

			this.alert({
			  type: 'error',
			  title: 'JS代码可能出错了！'
			});
			
		}
		
		
	}


	/**
	 * 
	 * @param {*} options 
	 * 	参数说明：
	 * 	{
	 * 		title : '提示信息标题',
	 * 		text : '提示信息文字',
	 * 		其它属性同ajax方法
	 * 	}
	 */
	ajaxWithConfirm(options){	
	
		if((!options.title) && (!options.text)){
			this.ajax(options);
			return;
		}	

		let warnTitle = options.title?options.title:'';
		let warnText = options.text?options.text:'';
		
		/*
		layer.confirm(				
			warnText,{icon: 3, title:warnTitle}, 				
			(index)=>{
				layer.close(index);
				this.ajax(options);
			}
		);     
		*/
		
		this.confirm({
			title: warnTitle,
			text: warnText
		}).then((result)=>{
			if(result.value){
				this.ajax(options);
			}
		});
		
	}


	/**
	 * 从服务器加载JSON数据
	 * 	参数opts json格式的参数，主要参数具体说明如下：
	 * 		{ 			
	 * 			url : '请求地址',
	 * 			data : '请求参数' 		
	 * 		}
	 * 
	 * 	参数handler 处理服务器响应数据的函数
	 */
	loadData(opts,handler){
		
		opts.handler = handler ;
		
		this.ajax(opts);
	}

	/**
	 * 从服务器加载文本
	 * 	参数opts json格式的参数，主要参数具体说明如下：
	 * 		{ 			
	 * 			url : '请求地址',
	 * 			data : '请求参数' 		
	 * 		}
	 * 
	 * 	参数handler 处理服务器响应数据的函数
	 */
	loadText(opts,handler){
		
		opts.dataType='text';

		opts.handler = handler ;
		
		this.ajax(opts);
	}

	/**
	 * 从服务器加载 html
	 * 	参数opts json格式的参数，主要参数具体说明如下：
	 * 		{ 			
	 * 			url : '请求地址',
	 * 			data : '请求参数' 		
	 * 		}
	 * 
	 * 	参数handler 处理服务器响应数据的函数
	 */
	loadHtml(opts,handler){
		
		opts.dataType='html';

		opts.handler = handler ;
		
		this.ajax(opts);
	}


	/**
	 * 对服务器发出操作要求
	 * 
	 * 	参数opts json格式的参数，主要参数具体说明如下：
	 * 		{
	 * 			title : '提示信息标题',
	 * 			text : '提示信息文字',
	 * 			url : '请求地址',
	 * 			data : '请求参数'	
	 * 		}
	 * 
	 * 	参数okHander 请求成功后执行的函数
	 */
	operate(opts,okHandler){
		let _this = this;
		opts.dataType = 'JSON';
		opts.handler = function(result){
			
			if (result.success) {
				
				/*
				layer.msg(result.message, {
					icon: 1,
					time: 2000
				});
				*/
				

				_this.autoAlert({
				  type: 'success',
				  title: result.message,
				  timer:1500
				});
				
				
				if(okHandler)okHandler(result);
				
			} else {
				/*layer.alert(result.message, {icon: 2}); */
				_this.alert({
				  type: 'error',
				  title: result.message
				});
				
			}
			
		};
		
		this.ajaxWithConfirm(opts);
	}



	/**
	 * 对服务器发出可上传文件的操作要求
	 * 参数说明
	 * 	参数opts json格式的参数，具体说明如下：
	 * 		{
	 * 			title : '提示信息标题',
	 * 			text : '提示信息文字',
	 * 			url : '请求地址',
	 * 			data : '请求参数'
	 * 		
	 * 		}
	 * 	参数 okHander 请求成功后执行的函数
	 */
	operateMultipart(opts,okHandler){
		opts.contentType=false
		opts.processData=false;
		
		this.operate(opts,okHandler);
	}
	
	
	
	/**
	 * 打开窗口
	 * 参数说明
	 * 参数opts json格式的参数，具体说明如下：
	 * 		{ 			
	 * 			title : '窗口标题',
	 * 			contentId : 窗口内容的id
	 * 			width : 窗口宽度
	 * 			height : 窗口高度
	 * 			 		
	 * 		}
	 * 
	 * 返回 窗口编号
	 */
	popWin(opts){
		
		var width = opts.width ? opts.width : 700;
		var height = opts.height ? opts.height : 470;
		var content = opts.contentId ? $('#'+opts.contentId) : '';
		
		var layerIdx = layer.open({
			type : 1,
			anim: new Date().getTime() % 6,
			title : opts.title,
			area : [ width+'px', height+'px' ],
			content : content,
			zIndex:100 //将层次降低，以使sweetalert能够在layer之上
		});
		
		return layerIdx;
	}

	/**
	 * 关闭窗口 
	 * 参数 窗口编号
	 */
	closeWin(dlg){
		layer.close(dlg);
	}

	/**
	 * 带确定按钮的提示框
	 * 第一个参数 图片类型:success / error / warning / info / question
	 * 第二个参数 提示文字
	 */
	coolAlert(type,title){
		this.alert({
			type:type,
			title:title
		});
	}
	
	/**
	 * 无确定按钮、可延时自动关闭的提示框
	 * 第一个参数 图片类型:success / error / warning / info / question
	 * 第二个参数 提示文字
	 */
	coolAutoAlert(type,title){
		this.autoAlert({
			type:type,
			title:title
		});
	}
	
	/**
	 * 确认框
	 * 第一个参数：标题
	 * 第二个参数：细节描述
	 * 第三个参数：确认之后需要执行的函数
	 */
	coolConfirm(title,text,confirmed){
		this.confirm({
			title: warnTitle,
			text: warnText
		}).then((result)=>{
			if(result.value){
				confirmed();
			}
		});
	}
	
	/**
	 * 无确定按钮、可延时自动关闭的微型提示
	 * 第一个参数 图片类型:success / error / warning / info / question
	 * 第二个参数 提示文字
	 */
	coolToast(type,title){
		this.toast({type:type,title:title});
	}

}

/**
 * 手动关闭的提示信息框
 */
Server.prototype.alert=Swal.mixin({
	confirmButtonColor: '#3085d6',
	confirmButtonText: '确定'
});

/**
 * 延时自动关闭的提示信息框
 * 
 */
Server.prototype.autoAlert = Swal.mixin({	
	showConfirmButton: false,
	timer: 3000
});




/**
 * 延时自动关闭的toast
 */
Server.prototype.toast = Swal.mixin({
	toast: true,
	showConfirmButton: false,
	timer: 3000
});




/**
 * 确认框
 */
Server.prototype.confirm=Swal.mixin({
	type: 'warning',
	showCancelButton: true,
	
	//confirmButtonColor: '#e33',
	//cancelButtonColor: '#EEEEEE',
	confirmButtonText: '确认操作',
	cancelButtonText: '取消'
});

Server.createServer=function(config){
	return new Server(config);
};

/**
 * 服务器操作对象
 */
const my = Server.createServer();



/**
 * 通过Vue实例引用的服务器对象
 */
if(Vue){
	Vue.prototype.$my=my;
}



